package com.gt.wxpay.cashier.application;

import com.gt.wxpay.cashier.domain.Result;
import com.gt.wxpay.cashier.domain.dto.QueryRefundDto;
import com.gt.wxpay.cashier.domain.model.CashierPayment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

public interface RefundRemoteService {
    /**
     * 订单支付成功后由于某种原因需要发起退款，则需要调用本接口发起退款申请。
     * 当交易发生之后一段时间内，由于买家或者卖家的原因需要退款时，卖家可以通过退款接口将支付款退还给买家，微信支付将在收到退款请求并且验证成功之后，按照退款规则将支付款按原路退到买家帐号上。
     * <p>
     * 注意：
     * <p>
     * 交易时间超过一年的订单无法提交退款
     * 微信支付退款支持单笔交易分多次退款，多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。申请退款总金额不能超过订单金额。 一笔退款失败后重新提交，请不要更换退款单号，请使用原商户退款单号
     * 请求频率限制：150qps，即每秒钟正常的申请退款请求次数不超过150次
     * 每个支付订单的部分退款次数不能超过50次
     * 如果同一个用户有多笔退款，建议分不同批次进行退款，避免并发退款导致退款失败
     * 申请退款接口的返回仅代表业务的受理情况，具体退款是否成功，需要通过退款查询接口获取结果
     * 错误或无效请求频率限制：6qps，即每秒钟异常或错误的退款申请请求不超过6次
     * 一个月之前的订单申请退款频率限制为：5000/min
     * 同一笔订单多次退款的请求需相隔1分钟
     *
     * @return CashierPayment
     */
    @RequestMapping("/create")
    Result<QueryRefundDto> create(@RequestBody CashierPayment cashierPayment);

    /**
     * 提交退款申请后，通过调用该接口查询退款状态。退款有一定延时，建议查询退款状态在提交退款申请后1分钟发起，一般来说零钱支付的退款5分钟内到账，银行卡支付的退款1-3个工作日到账。
     * @param refundNo refundNo (退款单号)
     * @return query
     */
    @GetMapping("/query")
    Result<QueryRefundDto> query(@RequestParam("refundNo") String refundNo);
}
